#!/usr/bin/env python3
"""
数据库迁移脚本：添加 last_started_at 字段
用于记录任务最后一次开始执行的时间
"""

import sys
import os
import traceback

# 添加项目根目录到Python路径
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from services.shared.db_pool import get_db_session
from services.shared.models.task import Task, TaskExecution
from services.shared.logger import get_logger
from sqlalchemy import text

logger = get_logger('migrate_last_started_at')

def migrate_last_started_at():
    """执行 last_started_at 字段迁移"""
    session = get_db_session()
    
    try:
        logger.info("开始执行 last_started_at 字段迁移")
        
        # 检查字段是否已存在
        try:
            # 尝试查询新字段，如果不存在会抛出异常
            session.execute(text("SELECT last_started_at FROM tasks LIMIT 1"))
            logger.info("last_started_at 字段已存在，跳过添加字段步骤")
        except Exception:
            logger.info("添加 last_started_at 字段到 tasks 表")
            session.execute(text("ALTER TABLE tasks ADD COLUMN last_started_at DATETIME NULL COMMENT '最后开始执行时间'"))
            session.commit()
            logger.info("成功添加 last_started_at 字段")
        
        # 为现有任务设置初始值
        logger.info("开始为现有任务设置 last_started_at 初始值")
        
        # 获取所有任务
        tasks = session.query(Task).all()
        updated_count = 0
        
        for task in tasks:
            # 获取该任务最近的执行记录
            latest_execution = session.query(TaskExecution).filter_by(task_id=task.id).order_by(TaskExecution.started_at.desc()).first()
            
            if latest_execution and latest_execution.started_at:
                task.last_started_at = latest_execution.started_at
                updated_count += 1
                logger.debug(f"任务 {task.id} ({task.name}) 设置 last_started_at = {latest_execution.started_at}")
        
        session.commit()
        logger.info(f"成功为 {updated_count} 个任务设置了 last_started_at 初始值")
        
        # 验证结果
        logger.info("验证迁移结果:")
        tasks_with_last_started = session.query(Task).filter(Task.last_started_at.isnot(None)).count()
        total_tasks = session.query(Task).count()
        tasks_with_executions = session.query(Task).filter(
            Task.id.in_(
                session.query(TaskExecution.task_id).distinct()
            )
        ).count()
        
        logger.info(f"总任务数: {total_tasks}")
        logger.info(f"有执行记录的任务数: {tasks_with_executions}")
        logger.info(f"已设置 last_started_at 的任务数: {tasks_with_last_started}")
        
        if tasks_with_last_started == tasks_with_executions:
            logger.info("✅ 迁移成功！所有有执行记录的任务都已设置 last_started_at")
        else:
            logger.warning(f"⚠️ 部分任务未设置 last_started_at，可能需要检查")
        
        return True
        
    except Exception as e:
        logger.error(f"迁移失败: {str(e)}")
        logger.error(f"错误详情: {traceback.format_exc()}")
        session.rollback()
        return False
    finally:
        session.close()

def main():
    """主函数"""
    logger.info("=" * 50)
    logger.info("开始执行 last_started_at 字段迁移")
    logger.info("=" * 50)
    
    success = migrate_last_started_at()
    
    if success:
        logger.info("=" * 50)
        logger.info("✅ 迁移完成！")
        logger.info("=" * 50)
        sys.exit(0)
    else:
        logger.error("=" * 50)
        logger.error("❌ 迁移失败！")
        logger.error("=" * 50)
        sys.exit(1)

if __name__ == "__main__":
    main()